package cn.edu.zafu.bigdata.yuyini;

import java.io.*;

public class RhymingWords {
    public static void main(String[] args) throws IOException {
        FileReader words = new FileReader("files\\words.txt");

        //进行单词的逆序、排序、再逆序还原
        Reader rhymedWords = reverse(sort(reverse(words)));

        //将处理后的单词列表输出显示
        BufferedReader in = new BufferedReader(rhymedWords);
        String input;
        while ((input = in.readLine()) != null)
            System.out.println(input);
        in.close();
    }

    //创建管道，创建并启动单词逆序线程
    public static Reader reverse(Reader source) throws  IOException{
        BufferedReader in = new BufferedReader(source);
        PipedWriter pipeOut = new PipedWriter();
        PipedReader pipeIn = new PipedReader(pipeOut);
        PrintWriter out = new PrintWriter(pipeOut);
        new ReverseThread(out,in).start();
        return pipeIn;
    }

    //创建管道，创建并启动单词排序线程
    public static Reader sort(Reader source) throws  IOException{
        BufferedReader in = new BufferedReader(source);
        PipedWriter pipeOut = new PipedWriter();
        PipedReader pipeIn = new PipedReader(pipeOut);
        PrintWriter out = new PrintWriter(pipeOut);
        new SortThread(out,in).start();
        return pipeIn;
    }
}

//ReverseThread
class ReverseThread extends Thread {
    private PrintWriter out = null;
    private BufferedReader in = null;
    public ReverseThread(PrintWriter out,BufferedReader in){
        this.out = out;
        this.in = in;
    }

    //逆序线程的线程体
    public void run(){
        if(out != null && in != null){
            try{
                String input;
                while ((input = in.readLine()) != null){
                    out.println(reverseIt(input));
                    out.flush();
                }
                out.close();
            }catch(IOException e){
                System.err.println("ReverseThread run:" + e);
            }
        }
    }

    //实现单词的逆序算法
    private String reverseIt(String source){
        int i,len =source.length();
        StringBuffer dest = new StringBuffer(len);
        for(i = (len-1);i>=0;i--)
            dest.append(source.charAt(i));
        return dest.toString();
    }
}

//SortThread
class SortThread extends Thread{
    private PrintWriter out = null;
    private BufferedReader in = null;

    public SortThread(PrintWriter out,BufferedReader in){
        this.out = out;
        this.in = in;
    }

    //排序线程的线程体
    public void run(){
        int MAXWORDS=50;
        if(out != null && in != null){
            try{
                String[] listOfWords = new String[MAXWORDS];
                int numwords=0;

                while ((listOfWords[numwords]=in.readLine())!=null)
                    numwords++;
                quicksort(listOfWords,0,numwords-1);
                for(int i = 0;i<numwords;i++)
                    out.println(listOfWords[i]);
                out.close();
            }catch (IOException e){
                System.err.println("SortThread run:"+e);
            }
        }
    }

    //实现快速排序算法
    private static void quicksort(String[] a,int lo0,int hi0){
        int lo = lo0;
        int hi = hi0;
        if (lo >= hi)
            return;
        String mid =a[(lo + hi) / 2];
        while (lo < hi){
            while (lo < hi && a[lo].compareTo(mid) < 0)
                lo++;
            while (lo < hi && a[hi].compareTo(mid) > 0)
                hi--;
            if(lo < hi){
                String T = a[lo];
                a[lo] = a[hi];
                a[hi] = T;
                lo++;
                hi--;
            }
        }
        if(hi<lo){
            int T = hi;
            hi = lo;
            lo = T;
        }
        quicksort(a, lo0, lo);
        quicksort(a, lo == lo0 ? lo+1 : lo, hi0);
    }
}

